<!DOCTYPE HTML>
<html>
<head>
  <title>Test for scrolling selection into view</title>
  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>

<pre id="test">
<script class="testbody" type="text/javascript">

var ANCHOR = 0;
var FOCUS = 1;
var win;

function testCollapsed(id, vPercent, startAt, expected) {
  var selection = SpecialPowers.wrap(win.getSelection())
                               .QueryInterface(SpecialPowers.Ci.nsISelectionPrivate);

  var c = win.document.getElementById("c" + id);
  var target = win.document.getElementById("target" + id);
  if (target.contentDocument) {
    selection = SpecialPowers.wrap(target.contentWindow.getSelection())
                             .QueryInterface(SpecialPowers.Ci.nsISelectionPrivate);
    target = target.contentDocument.getElementById("target" + id);
  }
  selection.collapse(target.parentNode, 0);
  c.scrollTop = startAt;
  selection.scrollIntoView(FOCUS, true, vPercent, 0);
  is(c.scrollTop, expected, "Scrolling " + target.id +
     " into view with vPercent " + vPercent + ", starting at " + startAt);
}

function doTest() {
  // Test scrolling an element smaller than the scrollport
  testCollapsed("1", 0, 0, 400);
  testCollapsed("1", 100, 0, 220);
  testCollapsed("1", -1, 0, 220);
  testCollapsed("1", 0, 500, 400);
  testCollapsed("1", 100, 500, 220);
  testCollapsed("1", -1, 500, 400);

  // overflow:hidden elements should not be scrolled by selection
  // scrolling-into-view
  testCollapsed("2", 0, 0, 0);
  testCollapsed("2", 100, 0, 0);
  testCollapsed("2", -1, 0, 0);
  testCollapsed("2", 0, 500, 500);
  testCollapsed("2", 100, 500, 500);
  testCollapsed("2", -1, 500, 500);

  // Test scrolling an element larger than the scrollport
  testCollapsed("3", 0, 0, 400);
  testCollapsed("3", 100, 0, 500);
  testCollapsed("3", -1, 0, 400);
  testCollapsed("3", 0, 1000, 400);
  testCollapsed("3", 100, 1000, 500);
  // If the element can't be completely visible, we make the top edge
  // visible.
  testCollapsed("3", -1, 1000, 400);

  // Test scrolling an element larger than the scrollport
  testCollapsed("4", 0, 0, 400);
  testCollapsed("4", 100, 0, 500);
  testCollapsed("4", -1, 0, 400);
  testCollapsed("4", 0, 1000, 400);
  testCollapsed("4", 100, 1000, 500);
  // If the element can't be completely visible, we make the top edge
  // visible.
  testCollapsed("4", -1, 1000, 400);

  // Test that scrolling a translated element into view takes
  // account of the transform.
  testCollapsed("5", 0, 0, 400);

  // Test that scrolling a scaled element into view takes
  // account of the transform.
  testCollapsed("6", 0, 0, 150);

  // Test that scrolling an element with a translated, scrolling container
  // into view takes account of the transform.
  testCollapsed("7", 0, 0, 400);

  win.close();
  SimpleTest.finish();
}

function openWindow() {
  win = open("scroll_selection_into_view_window.html", "_blank", "width=500,height=350");
}

SimpleTest.waitForExplicitFinish();
addLoadEvent(openWindow);
</script>
</pre>
</body>

</html>
